/* 
 * Copyright (c) 2003-2007 Israfil Consulting Services Corporation
 * Copyright (c) 2003-2007 Christian Edward Gruber
 * All Rights Reserved
 *
 * $Id: Types.java 129 2006-12-31 23:20:02Z cgruber $
 */
package net.israfil.foundation.valuemodel;

/**
 * An interface for objects that can notify observers of changes to itself 
 * before the change.  The objects thus notified can veto the change.  The
 * specific behaviour for vetoing is undefined and is dependent upon the
 * particular implementation of the vetoable object and its vetoers.
 * The changing object should call the provided callback signature, with the 
 * parameter being the object that was changed in its new state. The vetoer
 * is responsible for knowing what it needs to know in order to validate or
 * veto the change.
 * 
 * Using a dynamic selector rather than a strong interface allows code
 * to be notified of the change even if it was not constructed with the 
 * notification interface, though it does need to match the signature.
 * 
 * @author <a href="mailto:cgruber@israfil.net">Christian Edward Gruber</a>
 * @author Latest: $Author: cgruber $
 * @version $Revision: 129 $
 */
public interface Vetoable {
    
    /** Add one or more vetoers to this object, with a callback method spec 
     * that will be invoked upon a data change.  The callback method should 
     * contain three parameters.  The first is the notification source (the 
     * holder or whatever), the second the old value, and the third the new 
     * value. It also should return a boolean approving the change (or
     * returning false to veto it)
     */
    public void addVetoers(String callback, Object ... approvers);
    
    /** 
     * Remove one or more vetoers from vetoable object.
     */
    public void removeVetoers(Object ... approvers);

}
